package com.baiyinet.pay;

import android.app.Activity;
import android.content.Intent;
import android.text.TextUtils;

import com.alipay.sdk.app.PayTask;
import com.baiyinet.BuildConfig;
import com.baiyinet.biz.PageStatus;
import com.baiyinet.rest.ApiHelper;
import com.baiyinet.rest.PayParam;
import com.baiyinet.util.AppUtils;
import com.baiyinet.util.IntentUtils;
import com.baiyinet.util.Utils;
import com.tencent.mm.opensdk.modelpay.PayReq;
import com.tencent.mm.opensdk.openapi.IWXAPI;
import com.tencent.mm.opensdk.openapi.WXAPIFactory;

import java.util.Map;

import rx.Subscriber;

/**
 * 支付工具类
 */
public class PayUtils {

    /**
     * 支付结果显示页面
     */
    public static String PAY_RESULT_URL = "";
    public static String TOOLBAR_BG_COLOR = "";

    private static String mPayMethod = "";

    // 注意处理 mActivity 的清空过程
    private static Activity mActivity;

    /**
     * 处理支付动作
     * @param activity 上下文
     * @param payMethod 支付方式
     * @param no 订单号
     */
    public static void handlePayAction(Activity activity, ApiHelper apiHelper, String payMethod, String no, String toolbarBgColor) {
        if (activity == null) {
            return;
        }

        if(TextUtils.isEmpty(no) || TextUtils.isEmpty(payMethod)) {
            return;
        }

        mActivity = activity;
        TOOLBAR_BG_COLOR = toolbarBgColor;

        requestPayInfo(apiHelper, no, payMethod);
    }

    private static class PaySubscriber extends Subscriber<PayParam> {
        @Override
        public void onCompleted() {
        }

        @Override
        public void onError(Throwable e) {
            Utils.UI.showToastShort("支付参数错误，请联系客服！");
            mActivity = null;
        }

        @Override
        public void onNext(PayParam payParam) {

            if (!TextUtils.isEmpty(payParam.Errors)) {
                Utils.UI.showToastShort(payParam.Errors);
                return;
            }

            Utils.UI.showToastShort("支付操作请求中，请稍候");

            switch (mPayMethod) {
                case "WeChatPay":
                    responseWeChatPay(payParam);
                    break;
                case "AliPay":
                    responseAliaPay(payParam);
                    break;
            }
        }
    }

    private static void requestPayInfo(ApiHelper apiHelper, final String no, final String payMethod) {
        if("tenpayforapp".equals(payMethod.toLowerCase())) {
            mPayMethod = "WeChatPay";
            if (mActivity != null) {
                if (!AppUtils.isWXAppInstalled(mActivity)) {
                    Utils.UI.showToastLong("请先安装微信客户端");
                    return;
                } else if (!AppUtils.isWxAppSupported(mActivity)) {
                    Utils.UI.showToastLong("请先手动开启微信客户端或升级微信");
                    return;
                }
            }
        }else if("alipayforapp".equals(payMethod.toLowerCase())) {
            mPayMethod = "AliPay";
        }else {
            Utils.UI.showToastShort("支付失败");
            mActivity = null;
            return;
        }

        Subscriber<PayParam> mSubscriber = new PaySubscriber();
        apiHelper.getPayParam(mSubscriber, no, payMethod);
    }


    // Start Wechat Pay
    /**
     * 响应微信订单支付
     * @param payParam
     */
    private static void responseWeChatPay(PayParam payParam) {
        if(null == mActivity) {
            return;
        }

        IWXAPI api = WXAPIFactory.createWXAPI(mActivity, BuildConfig.WECHAT_APP_ID);
        try {
            PayReq req = new PayReq();
            req.appId			= payParam.AppId;
            req.partnerId		= payParam.PartnerId;
            req.prepayId		= payParam.PrepayId;
            req.nonceStr		= payParam.NonceStr;
            req.timeStamp		= payParam.TimeStamp;
            req.packageValue	= payParam.Package;
            req.sign			= payParam.Sign;
            // 支付结果显示页面
            PAY_RESULT_URL      = payParam.ShowResultUrl;
//            req.extData			= "pay by wechat"; // optional
            api.sendReq(req);
        }catch (Exception e) {
            e.printStackTrace();
        } finally {
            mActivity = null;
        }
    }
    // END Wechat Pay

    // Start Alia Pay

    /**
     * 响应支付宝订单支付
     * @param payParam
     */
    private static void responseAliaPay(PayParam payParam) {
        if(null == mActivity) {
            return;
        }

        final String orderInfo = getOrderInfo(payParam);
        if(TextUtils.isEmpty(orderInfo)) {
            return;
        }

//        String sign = sign(orderInfo, payParam);
//        try {
//            /**
//             * 仅需对sign 做URL编码
//             */
//            sign = URLEncoder.encode(sign, "UTF-8");
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }

//        if(TextUtils.isEmpty(sign)) {
//            return;
//        }

//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                PayTask payTask = new PayTask(MyPayActivity.this);
//                Map<String, String> payV2 = payTask.payV2(credential, true);
//                String resultCode = payV2.get("resultStatus");
//                Intent intent = new Intent("android.intent.action.wxpay");
//                intent.putExtra("respCode",Integer.parseInt(resultCode));
//                intent.putExtra("payByAlipay",true);
//                sendBroadcast(intent);
//            }
//        }).start();

        /**
         * 完整的符合支付宝参数规范的订单信息
         */
//        final String payInfo = orderInfo + "&sign=\"" + sign + "\"&" + getSignType();
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 构造PayTask 对象
                PayTask alipay = new PayTask((Activity) mActivity);
                // 调用支付接口，获取支付结果
                final Map<String, String> result = alipay.payV2(orderInfo, true);

                /**
                 * 同步返回的结果必须放置到服务端进行验证（验证的规则请看https://doc.open.alipay.com/doc2/
                 * detail.htm?spm=0.0.0.0.xdvAU6&treeId=59&articleId=103665&
                 * docType=1) 建议商户依赖异步通知
                 */
                mActivity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
//                        PayResult payResult = new PayResult(result);
//                        String resultInfo = payResult.getResult();// 同步返回需要验证的信息
                        String resultStatus = result.get("resultStatus");
//                        String resultStatus = payResult.getResultStatus();
                        // 判断resultStatus 为“9000”则代表支付成功，具体状态码代表含义可参考接口文档
                        if (TextUtils.equals(resultStatus, "9000")) {
                            Utils.UI.showToastShort("支付成功");
                            // 跳转支付结果页面
                            String url = PAY_RESULT_URL.startsWith("http") ? PAY_RESULT_URL
                                    : "http://".concat(PAY_RESULT_URL);
                            PageStatus pageStatus = new PageStatus(url, true, true, TOOLBAR_BG_COLOR);
                            IntentUtils.toNewGeneralActivity(mActivity, pageStatus);
                            PAY_RESULT_URL = "";
                        } else {
                            // 判断resultStatus 为非"9000"则代表可能支付失败
                            // "8000"代表支付结果因为支付渠道原因或者系统原因还在等待支付结果确认，最终交易是否成功以服务端异步通知为准（小概率状态）
                            if (TextUtils.equals(resultStatus, "8000")) {
                                Utils.UI.showToastShort("支付结果确认中");
                            } else {
                                // 其他值就可以判断为支付失败，包括用户主动取消支付，或者系统返回的错误
                                Utils.UI.showToastShort("支付失败");
                            }
                        }
                        mActivity = null;
                    }
                });
            }
        }).start();
    }

    /**
     * 获取订单信息
     * @param payParam
     * @return
     */
    private static String getOrderInfo(PayParam payParam) {
        String orderInfo = "";
        try {
//            // 签约合作者身份ID
//            orderInfo = "partner=" + "\"" + payParam.Partner + "\"";
//
//            // 签约卖家支付宝账号
//            orderInfo += "&seller_id=" + "\"" + payParam.SellerId + "\"";
//
//            // 商户网站唯一订单号
//            orderInfo += "&out_trade_no=" + "\"" + payParam.OutTradeNo + "\"";
//
//            // 商品名称
//            orderInfo += "&subject=" + "\"" + payParam.Subject + "\"";
//
//            // 商品详情
//            orderInfo += "&body=" + "\"" + payParam.Body + "\"";
//
//            // 商品金额
//            orderInfo += "&total_fee=" + "\"" + payParam.TotalFee + "\"";
//
//            // 服务器异步通知页面路径
//            orderInfo += "&notify_url=" + "\"" + payParam.NotifyUrl + "\"";
//
//            // 服务接口名称， 固定值
//            orderInfo += "&service=" + "\"" + payParam.Service + "\"";
//
//            // 支付类型， 固定值
//            orderInfo += "&payment_type=" + "\"" + payParam.PaymentType + "\"";
//
//            // 参数编码， 固定值
//            orderInfo += "&_input_charset=" + "\"" + payParam.InputCharset + "\"";
//
//            // 设置未付款交易的超时时间
//            // 默认30分钟，一旦超时，该笔交易就会自动被关闭。
//            // 取值范围：1m～15d。
//            // m-分钟，h-小时，d-天，1c-当天（无论交易何时创建，都在0点关闭）。
//            // 该参数数值不接受小数点，如1.5h，可转换为90m。
//            orderInfo += "&it_b_pay=" + "\"" + payParam.ItBPay + "\"";
//
//            // extern_token为经过快登授权获取到的alipay_open_id,带上此参数用户将使用授权的账户进行支付
//            // orderInfo += "&extern_token=" + "\"" + extern_token + "\"";
//
//            // 支付宝处理完请求后，当前页面跳转到商户指定页面的路径，可空
//            orderInfo += "&return_url=\"m.alipay.com\"";

            // 调用银行卡支付，需配置此参数，参与签名， 固定值 （需要签约《无线银行卡快捷支付》才能使用）
            // orderInfo += "&paymethod=\"expressGateway\"";

            // 支付结果显示页面
            PAY_RESULT_URL      = payParam.ShowResultUrl;
            // 临时返回的数据
            orderInfo = payParam.Body;
        }catch (Exception e) {
            e.printStackTrace();
        }

        return orderInfo;
    }

    /**
     * sign the order info. 对订单信息进行签名
     *
     * @param content
     *            待签名订单信息
     */
//    private static String sign(String content, PayParam payParam) {
//        if(TextUtils.isEmpty(content) || TextUtils.isEmpty(payParam.PrivateKey)) {
//            return "";
//        }
//        try {
//            return SignUtils.sign(content, payParam.PrivateKey);
//        }catch (Exception e) {
//            e.printStackTrace();
//        }
//        return "";
//    }

    /**
     * get the sign type we use. 获取签名方式
     *
     */
    private static String getSignType() {
        return "sign_type=\"RSA\"";
    }

    // END Alia Pay
}
